# [HCTF 2018]WarmUp 1

# PHP函数

# 1.mb_substr( )

获取部分字符串

 mb_substr ( string $str , int $start , int $length = NULL , string $encoding = mb_internal_encoding() ) : string

根据字符数执行一个多字节安全的 substr() (opens new window) 操作。 位置是从 str 的开始位置进行计数。 第一个字符的位置是 0。第二个字符的位置是 1,以此类推。

# 2.mb_strpos( )

查找字符串在另一个字符串中首次出现的位置

mb_strpos ( string $haystack , string $needle , int $offset = 0 , string $encoding = mb_internal_encoding() ) : int

查找 string 在一个 string 中首次出现的位置。

基于字符数执行一个多字节安全的 strpos() 操作。 第一个字符的位置是 0,第二个字符的位置是 1,以此类推。

# 解题

截屏2021-06-01 下午12.22.33

打开场景,看到一张特别滑稽的滑稽笑脸。先点击F12用开发者工具查看一下源代码。发现了source.php。

截屏2021-06-01 下午12.27.53

打开source.php可以查看到主页的源代码,通过源代码可以判断出,这是一道文件包含问题。

截屏2021-06-01 下午12.29.10

前面是一个类,先给他跳过去一会再看。

	if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  

先看底部的代码,发现这里获取请求的file参数,要求不可以为空,同时满足是字符串,且要满足上面emmm类中的chackfile函数。之后就可以包含(运行)运行刚刚上传的文件。(这里暗示需要上传一个PHP文件)

通过查看上面定义chackFile函数的代码,可以看出来当上传的文件满足这三个条件时,可以返回trun,之后执行 include $_REQUEST['file']; 这句话:

而且通过判断,这个程序会取到 ? 前面的值。

也就是说,提交 hint.php?../../../../../ 等也是可以通过的,因为他在判断时候仅判断 ?hint.php 的部分。

打开hint.php,看到提示flag在ffffllllaaaagggg中。

由此可以构建payload:http://xxx/index.php?file=source.php%253f../../../../../ffffllllaaaagggg

得到Flag,题目解出。

# 错误的想法

一开始还有想过将一个写有高亮hint.php的source.php上传上去,但是实践证明,我想错了。

# 知识点

  1. 文件包含
  2. Get提交
  3. 字符串截断

# 参考文章

后期部分参考了@1stPeak 大佬的文章,但还是没找到我想要的答案,就是hint.php?后面那一堆为什么这么构建,求解答~~